package pe.com.hermes.hermetic.web.controller.general;


import pe.com.hermes.hermetic.beans.ActaImprBean;
import pe.com.hermes.hermetic.beans.ComprobanteServicioBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;

import java.io.InputStream;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("reporteActaAnomalia")
public class ReporteActaAnomaliaController implements IController{ 
    @Autowired
    private HermeticFacade servicioHermetic; 
    
    public String mostraReporte(HttpServletRequest request, HttpServletResponse response, ComprobanteServicioBean cmpbServBean) throws Exception {
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        String desSucursal = (String)request.getSession().getAttribute("desSucursal");
        
        InputStream reportStream = null;
        
        try {
            
            //datos iniciales
            String formulario = request.getParameter("formulario");
            String fecha_srv = servicioHermetic.getFechaHoy();
            String hora_srv = servicioHermetic.getFecha2().substring(8, 16);
            String cod_clie = (String)request.getSession().getAttribute("cliente");
            String nomClie = "";
            if ((cmpbServBean.getCliente() == null) || (cmpbServBean.getCliente().trim().isEmpty())){
                nomClie = (String)request.getSession().getAttribute("nombreCliente");
            }else {
                nomClie = cmpbServBean.getCliente();
            }
            
            //obtengo los datos de anomalia
            List listActaBean = servicioHermetic.getActaAnomalia(cmpbServBean.getSerie(), cmpbServBean.getTipoDoc(),cmpbServBean.getNumero());
            
            //SETEAR LOS DATOS DEL ACTA A cmpbServBean.getTipoDocuActa()          
            if (listActaBean!=null && listActaBean.size()>0 ){
                ComprobanteServicioBean cmpbActaBean = (ComprobanteServicioBean)listActaBean.get(0);
                cmpbServBean.setTipoDocuActa(cmpbActaBean.getTipoDocuActa());
                cmpbServBean.setSerieActa(cmpbActaBean.getSerieActa());
                cmpbServBean.setNumActa(cmpbActaBean.getNumActa());
                cmpbServBean.setCodClasActa(cmpbActaBean.getCodClasActa());
                cmpbServBean.setCodEmplImp(cmpbActaBean.getCodEmplImp());
                cmpbServBean.setTxtObserv(cmpbActaBean.getTxtObserv());
                cmpbServBean.setTxtObserv1(cmpbActaBean.getTxtObserv1());
                cmpbServBean.setTxtObserv2(cmpbActaBean.getTxtObserv2());
                cmpbServBean.setFechaProc(cmpbActaBean.getFechaProc());
            }
            
            //obtengo DESNOTA
            String desNota1 = servicioHermetic.getDesNotaActa(cmpbServBean.getTipoDocuActa(),
                                                              ConstantesHermetic.ACTA_NSE_SECU, 
                                                              ConstantesHermetic.ACTA_COD_SECC_PRI, 
                                                              ConstantesHermetic.ACTA_NSE_POSI_PRI);
            String desNota2 = servicioHermetic.getDesNotaActa(cmpbServBean.getTipoDocuActa(),
                                                              ConstantesHermetic.ACTA_NSE_SECU, 
                                                              ConstantesHermetic.ACTA_COD_SECC_SEG, 
                                                              ConstantesHermetic.ACTA_NSE_POSI_PRI);                                                              
            
            //Obtengo CF_label
            String tipoActa = servicioHermetic.getDesTipoActa(ConstantesHermetic.TIPO_COD_GRUPO_CLAS_ACTA, cmpbServBean.getCodClasActa());
            
            //Genero la informacion de la tabla Bt_Test_Impr
            String numUnicActa = servicioHermetic.getNumUnicActaImp(cmpbServBean.getSerieActa(), 
                                                                    cmpbServBean.getTipoDocuActa(), 
                                                                    cmpbServBean.getNumActa(),
                                                                    cmpbServBean.getCodEmplImp(),
                                                                    cmpbServBean.getCodClasActa());            
            
            //Obtengo la informacion de Bt_Test_Impr en el bean Comprobante
            List listActaImpr = servicioHermetic.getActaImpr(cmpbServBean.getSerieActa(), cmpbServBean.getTipoDocuActa(), cmpbServBean.getNumActa(), numUnicActa);  
            ActaImprBean actaImprBean = null;
            if (listActaImpr!=null && listActaImpr.size()>0 ){
                actaImprBean = (ActaImprBean)listActaImpr.get(0);
            }            
            
            //Obtengo la fecha de PROCESO
            String fechaProceso = servicioHermetic.getFechaProcesoActa(cmpbServBean.getSerieActa(), cmpbServBean.getTipoDocuActa(), cmpbServBean.getNumActa(), cmpbServBean.getFechaProc());                        
            
            //Obtengo la desripcion del usuario
            String nombreRemitente = servicioHermetic.getRemitenteActa(cmpbServBean.getSerieActa(), cmpbServBean.getTipoDocuActa(), cmpbServBean.getNumActa(), actaImprBean.getNomPuntOrig(), nomClie);                        
            
            //obtengo la observacion 1
            //String txtObsv = "";
            //String numBill = "";
            String obsvActa = servicioHermetic.getObsvActa(actaImprBean.getCodAnom(), actaImprBean.getTipAnom(), actaImprBean.getTxtObsv(), actaImprBean.getNumBill());

            //Obtengo la diferencia del acta 
            String diferenciaActa = servicioHermetic.getDiferenciaActa(cmpbServBean.getSerieActa(), cmpbServBean.getTipoDocuActa(), cmpbServBean.getNumActa(), actaImprBean.getCodBove(), actaImprBean.getMonDife());
                        
            for (int i=0;i<listActaImpr.size();i++){
                if (listActaImpr.get(i)!=null){
                  ActaImprBean acta=(ActaImprBean)listActaImpr.get(i);
                  String nuevaObsv=servicioHermetic.getObsvActa(acta.getCodAnom(), acta.getTipAnom(), acta.getTxtObsv(), acta.getNumBill());
                  String difeActa=servicioHermetic.getDiferenciaActa(cmpbServBean.getSerieActa(), cmpbServBean.getTipoDocuActa(), cmpbServBean.getNumActa(), acta.getCodBove(), acta.getMonDife());
                  acta.setTxtObsv(nuevaObsv);
                  acta.setMonDife(difeActa);
                }
            }
                       
            StringBuffer numActaCompleto =  new StringBuffer(cmpbServBean.getTipoDocuActa()).append("-").append(cmpbServBean.getSerieActa()).append("-").append(cmpbServBean.getNumActa());
            
            //ELIMINAR los datos del Acta en la tabla temporal
            String eliminaActaTemp = servicioHermetic.eliminaActaTemp(numUnicActa);
            
            //Obtengo la descripcion de la CLASE
            String desClase = servicioHermetic.getDescClase(cmpbServBean.getCodClasActa());
            
            //Obtengo la descripcion de SERIALES
            String seriales = servicioHermetic.getSeriales(cmpbServBean.getSerieActa(), cmpbServBean.getTipoDocuActa(), cmpbServBean.getNumActa());
            
            //Obtengo la ruta de la firma
            String rutaDireFirma = session.getServletContext().getInitParameter("rutaDireFirma");
            String nombreFirma = servicioHermetic.getNombreFirma(cmpbServBean.getCodEmplImp());
            StringBuffer rutaFirma = new StringBuffer(rutaDireFirma).append("/").append(nombreFirma);
            
            //String rutaJasper = getServlet().getServletConfig().getServletContext().getInitParameter("rutajasper");
            String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
            
            StringBuffer jasperPath = new StringBuffer(rutaJasper).append("/").append(formulario).append(".jasper");
            
            //List listDetalleRecojo = form.getListaDetalleRecojo();
            //List listaDetalleRecojo = (List)session.getAttribute("listaDetalleRecojo");

            //JRDataSource simpleDS = null;//new JRBeanCollectionDataSource(listResultadoApertura);
            JRDataSource simpleDS= new JRBeanCollectionDataSource(listActaImpr);
            
            Map parameters = new HashMap();
            //parameters.put("datasource", subDS1);
            parameters.put("cod_clie", cod_clie);
            parameters.put("nom_clie", nomClie);
            parameters.put("desSucursal", desSucursal);            
            //parameters.put("fec_orig1", form.getFechadesde());
            //parameters.put("fec_orig2", form.getFechahasta());
            //parameters.put("isMatrizActive",form.isExisteMatriz());
            parameters.put("fecha_srv",fecha_srv);
            parameters.put("hora_srv",hora_srv);
            
            //Parametros REPORTE
            parameters.put("numActa", numActaCompleto.toString() );             
            parameters.put("desNota", desNota1);
            parameters.put("cfLabel", tipoActa);
            parameters.put("serieCmpb", cmpbServBean.getSerie());
            parameters.put("numCmpb", cmpbServBean.getNumero());
            parameters.put("nomClie", nomClie);
            parameters.put("totaEnva", actaImprBean.getCanTotlEnva()); 
            parameters.put("fechProc", fechaProceso);
            parameters.put("desUsua", nombreRemitente);
            parameters.put("nroCabiMesa", actaImprBean.getNroCabiMesa()); 
            parameters.put("descGene", actaImprBean.getNomEmplGene());
            parameters.put("cfDesClase", desClase);//VALIDAR            
            // DETALLE ACTA            
           parameters.put("descBove", actaImprBean.getDesBove());
           parameters.put("fecAperBove", actaImprBean.getFecAperBove());
           parameters.put("desRctoBove", actaImprBean.getDesRctoBove());
           parameters.put("cntaBove", actaImprBean.getCntaBove());
           parameters.put("descAnom", actaImprBean.getDesAnom());
           parameters.put("desUnidMone", actaImprBean.getDesUnidMone());
           parameters.put("monAnom", actaImprBean.getMonAnom());   
           parameters.put("cintaActa", actaImprBean.getNumCint());
           parameters.put("horaActa", actaImprBean.getHorAnom());
           parameters.put("obsActa", obsvActa);
           parameters.put("nomResp", actaImprBean.getNomResp() );
           parameters.put("monDiceCont", actaImprBean.getMonDiceCont());
           parameters.put("monRealCont", actaImprBean.getMonRealCont());
           parameters.put("dife", diferenciaActa); 
            parameters.put("fSeriales", seriales);//VALIDAR   
            parameters.put("fTxtObsv", cmpbServBean.getTxtObserv());
            parameters.put("fTxtObsv1", cmpbServBean.getTxtObserv1() );
            parameters.put("fTxtObsv2", cmpbServBean.getTxtObserv2());
            parameters.put("cFDesNota",desNota2 );
            parameters.put("cfSupe",actaImprBean.getCodEmplSupe() + " -  " + actaImprBean.getNomEmplSupe() );//VALIDAR               
            parameters.put("rutaFirma",rutaFirma.toString() );//VALIDAR
            parameters.put("contextPath",request.getSession().getServletContext().getRealPath("/"));                        
            ServletOutputStream servletOutputStream = response.getOutputStream();
            //InputStream reportStream = getServlet().getServletConfig().getServletContext().getResourceAsStream(jasperPath.toString());
            reportStream = request.getSession(false).getServletContext().getResourceAsStream(jasperPath.toString());
            
            response.setContentType("application/pdf");
            byte[] bytes = null;        
            bytes = JasperRunManager.runReportToPdf(reportStream, parameters, simpleDS);
            response.setHeader("Cache-Control","cache"); // HTTP 1.1
            response.setHeader("Pragma","cache"); // HTTP 1.0
            response.setDateHeader ("Expires", -1);         
            response.setContentType("application/pdf");
            response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
            response.setContentLength(bytes.length);         
            servletOutputStream.write(bytes, 0, bytes.length);
            servletOutputStream.flush();
            servletOutputStream.close();
            //model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_ERROR_VIEW;    
    
    }

    }
